package com.by.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

/**
 * @author Ye QS
 * @version 0.1
 * @className SwaggerConfig
 * @description
 * @date 2024/9/5 10:22
 * @since jdk11
 */
@Configuration
// 使用 @Configuration 注解声明这是一个配置类，可以用来定义 Spring 上下文中的各种 Bean

@EnableOpenApi
// 使用 @EnableOpenApi 注解启用 OpenAPI 支持，便于生成 API 文档

public class SwaggerConfig {

    @Bean
    // 定义一个名为 createDocket 的 Bean 对象，类型为 Docket，用于自定义 Swagger 配置
    public Docket createDocket() {
        // 创建并返回一个新的 Docket 实例对象，设置文档类型为 SWAGGER_2
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(getApiInfo())
                // 设置 API 信息，如标题、描述等元数据
                .select()
                // 开始选择哪些接口和路径将被包含在文档中

                // 选择位于 com.by.controller 包下的控制器类作为文档的来源
                .apis(RequestHandlerSelectors.basePackage("com.by.controller"))

                // 限定只展示以 /v1/** 结尾的路径
                .paths(PathSelectors.ant("/v1/**"))

                // 构建最终的 Docket 配置实例
                .build();
    }

    // 私有方法 getApiInfo 用于构建 API 的基本信息，包括标题、版本号、联系人信息等
    private ApiInfo getApiInfo() {
        // 创建并返回一个新的 ApiInfoBuilder 实例，并设置相应的属性
        return new ApiInfoBuilder()
                .title("微商分销系统")
                // 设置 API 文档的标题

                .description("微商分销系统的接口文档，里面包含了所有的请求及参数信息")
                // 设置 API 文档的描述

                .contact(new Contact("叶青松", "http://localhost", "208082212@qq.com"))
                // 设置联系人的姓名、网址和电子邮件地址

                .version("v1.0")
                // 设置 API 版本号

                .build();
        // 构建并返回最终的 ApiInfo 实例
    }
}